// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using System.Text.Json;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace Microsoft.AspNetCore.StaticWebAssets.Tasks;

public class StaticWebAssetsReadPackManifest : Task
{
    [Required]
    public string ManifestPath { get; set; }

    [Output] public ITaskItem[] Files { get; set; }

    [Output] public ITaskItem[] AdditionalElementsToRemoveFromPacking { get; set; }

    public override bool Execute()
    {
        if (!File.Exists(ManifestPath))
        {
            Log.LogError($"Manifest file at '{ManifestPath}' not found.");
            return false;
        }

        try
        {
            var manifest = JsonSerializer.Deserialize<StaticWebAssetsPackManifest>(File.ReadAllBytes(ManifestPath));
            Files = manifest.Files.Select(ToTaskItem).ToArray();
            AdditionalElementsToRemoveFromPacking = manifest.ElementsToRemove?.Select(e => new TaskItem(e)).ToArray() ?? Array.Empty<ITaskItem>();
        }
        catch (Exception ex)
        {
            Log.LogErrorFromException(ex, showStackTrace: true, showDetail: true, file: ManifestPath);
        }

        return !Log.HasLoggedErrors;

        static ITaskItem ToTaskItem(StaticWebAssetPackageFile file)
        {
            var result = new TaskItem(file.Id);
            result.SetMetadata(nameof(StaticWebAssetPackageFile.PackagePath), file.PackagePath);
            return result;
        }
    }

    private sealed class StaticWebAssetPackageFile
    {
        public string Id { get; set; }

        public string PackagePath { get; set; }
    }

    private sealed class StaticWebAssetsPackManifest
    {
        public StaticWebAssetPackageFile[] Files { get; set; }

        public string[] ElementsToRemove { get; set; }
    }
}
